1. /* sdcbrwpi.cpp by K.Tsuru */
  2. // function ID 3553 DARDIX
  3. /***********************************************************
  4. pi by Borweins' method improved by by Takahashi and Kanada.
  5. ************************************************************/
  6. #ifndef SN_H
  7. #include "sn.h"
  8. #endif
  9. SDouble BorweinsPi(){
  10. SDouble x(2.0);
  11. uint max_sz = x.MaxSize();
  12. //It takes into irreducible maximum size mode.
  13. //It confirms that your system has enough memory.
  14. SDouble a(x.Type(), max_sz), b(x.Type(), max_sz), y(x.Type(), max_sz), w(x.Type(), max_sz),
  15. d(x.Type(), max_sz);
  16. int c;
  17. d = Sqrt(2.0);
  18. a = 6 - 4*d; y = 17 - 12*d;
  19. y.FixedPoint(1);
  20. int itrmax = 2*howpow2(max_sz);
  21. c = 0;
  22. do{
  23. d = ONE + RecQrrt(ONE-y); // 1+(1-y)^(-1/4)
  24. y = ONE - 2/d;
  25. b = y*y;
  26. d = ONE+2*y+b;
  27. w = d*d;
  28. d = ONE+b;
  29. d = d*d;
  30. a = a*w-x*(w-d);
  31. if(y.IsMLT(ONE)) break; // y << 1.0 or not
  32. x *= 4;
  33. y = b*b; // This statement is lacked in Takahashi and Kanada's paper.
  34. c++;
  35. } while(c < itrmax);
  36. y.PointFree();
  37. // free memory of figure[]
  38. b.SizeZero(); y.SizeZero(); w.SizeZero(); d.SizeZero();
  39. a = DReciprocal(a);
  40. if(c == itrmax) y.SetError(y.FATAL, "BorweinsPi", 3553);
  41. y.iterationCount = c;
  42. return a;
  43. }
  44. // obedient method
  45. #if 0
  46. SDouble BorweinsPi(){
  47. SDouble a, a1, y2, y4, y, d, pi, p(8.0);
  48. int c;
  49. d = Sqrt(2.0);
  50. a = 6 - 4*d; y = d - ONE;
  51. y.FixedPoint(0);
  52. int itrmax = 2*howpow2(a.MaxSize());
  53. c = 0;
  54. do{
  55. y2 =y*y; y4 = y2*y2; // y4 = y^4
  56. y4 = Qrrt(ONE - y4); // (1-y4)^(1/4)
  57. y = (ONE-y4)/(ONE+y4);
  58. y2 = y*y;
  59. a1 = a*Dpow(ONE+y, 4) - p*(y*(ONE + y2)+y2);
  60. d = a1-a;
  61. if(d.IsMLT(a)) break;
  62. a = a1;
  63. p *= 4;
  64. c++;
  65. } while(c < itrmax);
  66. pi = DReciprocal(a);
  67. y.iterationCount = c;
  68. return pi;
  69. }
  70. #endif

sdcbrwpi.cpp : last modifiled at 2016/09/04 14:21:39(1,784 bytes)
created at 2017/10/07 10:21:15
The creation time of this html file is 2017/10/07 10:30:03 (Sat Oct 07 10:30:03 2017).